昨天儲存完的一小時數據可以開始使用FinRL
的初始範例來訓練自動交易策略。
讀取資料時,由於FinRL
需要設定factorize的index,這邊我借用了已經寫好的data_split(...)
來讓train
與trade
的index符合使用規則:
def main():
INIT_AMOUNT = 1000000
TRAIN_START_DATE = '2019-09-21'
TRAIN_END_DATE = '2023-12-01'
TRADE_START_DATE = '2024-01-01'
TRADE_END_DATE = '2024-09-21'
train = pd.read_csv("sp500_1hour_2019-09-21_2024-01-01_train.csv")
trade = pd.read_csv("sp500_1hour_2024-01-01_2024-09-21_trade.csv")
processed_full = pd.concat([train, trade], ignore_index=True)
train = data_split(processed_full, TRAIN_START_DATE, TRAIN_END_DATE)
trade = data_split(processed_full, TRADE_START_DATE, TRADE_END_DATE)
......
之後的步驟就和先前的範例一致,先訓練DRL
模型 train_drl(e_train_gym, models_info)
然而,目前訓練到現在還不到一半,由於
FinRL
訓練程式碼沒有充分利用CPU與GPU,導致訓練速度緩慢,在這樣的數據量下,可能要跑十幾個小時以上都不一定能好。
再加上之後我想嘗試的是使用日內數據來訓練DRL
做自動交易,而FinRL
與ElegantRL
的範例大多都是使用美股日線資料;因此我明天會花一些時間調研看有沒有更合適的開源專案可以使用,如果有找到的話,傾向於直接使用專門用來訓練日內數據的程式碼來學習,來縮短學習成本。
def main():
......
# Step 3: Train DRL Models
# Initialize StockTradingEnv for training
stock_dimension = len(train.tic.unique())
state_space = 1 + 2 * stock_dimension + len(INDICATORS) * stock_dimension
print(f"Stock Dimension: {stock_dimension}, State Space: {state_space}")
buy_cost_list = sell_cost_list = [0.001] * stock_dimension
num_stock_shares = [0] * stock_dimension
env_kwargs = {
"hmax": 100,
"initial_amount": INIT_AMOUNT,
"num_stock_shares": num_stock_shares,
"buy_cost_pct": buy_cost_list,
"sell_cost_pct": sell_cost_list,
"state_space": state_space,
"stock_dim": stock_dimension,
"tech_indicator_list": INDICATORS,
"action_space": stock_dimension,
"reward_scaling": 1e-4
}
e_train_gym = StockTradingEnv(df=train, **env_kwargs)
# Train models
trained_models = train_drl(e_train_gym, models_info)